前情提要:
因應手上接到的專案,
需做發票廠商的置換,
但是對PHP也不熟悉,
故順便做個紀錄紀錄起來。
綠界電子發票串接說明文件
線上測試程式碼
https://paiza.io/projects/dSoC3N7pYCvEfrm0lKjQRg?language=php
注意
PHP urlencode function 會將 ! 字元編碼成 %21,不符合「.NET 編碼(ecpay)」,所以在 PHP urlencode 後需用 str_replace function 將%21 轉回 ! 字元。
以下僅以 PHP 轉換範例說明:
$sMacValue = str_replace('%21', '!', $sMacValue);
$sMacValue = str_replace('%2a', '*', $sMacValue);
$sMacValue = str_replace('%28', '(', $sMacValue);
$sMacValue = str_replace('%29', ')', $sMacValue);
其它程式語言的轉換功能,請看串接說明文件內該程式語言的編碼轉換規則改寫。
範例
<?php
date_default_timezone_set('Asia/Taipei');
$CustomerName = '測試';
$CustomerAddr = '台北市';
$CustomerEmail = "abc@ecpay.com.tw";
$ItemName = '測試';
$ItemWord = '支';
$TimeStamp = strtotime("now");
$RelateNumber = strtotime("now");
// ECPay_EInvoice的Request參數建立
// 參照綠界電子發票串接說明文件,說明中有說明部分參數需將參數值做 UrlEncode
$ECPay_EInvoice = array(
'CustomerName' => urlencode($CustomerName),
'CustomerAddr' => urlencode($CustomerAddr),
'CustomerEmail' => str_replace('@','%40',$CustomerEmail),
'TimeStamp' => $TimeStamp,
'MerchantID' => '2000132',
'RelateNumber' => $RelateNumber,
'TaxType' => '1',
'SalesAmount' => 100,
'ItemCount' => '1',
'ItemPrice' => '100',
'ItemAmount' => '100',
'InvType' => '07',
'LoveCode' => '168001',
'Print' => '0',
'Donation' => '1',
);
// 依照array的key去做順序排序
ksort($ECPay_EInvoice);
// 利用json_encode將資料轉成JSON格式
$data_json = json_encode($ECPay_EInvoice, JSON_UNESCAPED_UNICODE);
// 利用str_replace以其他字符替换字符串中的一些字符
$data_json = str_replace('{','',$data_json);
$data_json = str_replace('}','',$data_json);
$data_json = str_replace('"','',$data_json);
$data_json = str_replace(':','=',$data_json);
$data_json = str_replace(',','&',$data_json);
// 塞入HashKey以及HashIV
$originStr = 'HashKey=ejCk326UnaZWKisg&' .$data_json. '&HashIV=q9jcZX8Ib9LM8wYk';
// 以urlencode做URI(Uniform Resource Identifier)的轉換
$originStr = urlencode($originStr);
// 轉為小寫
$originStr = strtolower($originStr);
// 利用str_replace以其他字符替换字符串中的一些字符
$originStr = str_replace('%20', '+', $originStr);
$originStr = str_replace('%21', '!', $originStr);
$originStr = str_replace('%2a', '*', $originStr);
$originStr = str_replace('%2d', '-', $originStr);
$originStr = str_replace('%2e', '.', $originStr);
$originStr = str_replace('%28', '(', $originStr);
$originStr = str_replace('%29', ')', $originStr);
$originStr = str_replace('%5f', '_', $originStr);
// MD5加密方式
$hashed = hash("md5",$originStr);
// 轉為大寫
$checkMacValue = strtoupper($hashed);
// 實際測試,僅有在做CheckMacValue時,需將參數值做 UrlEncode,但說明文件內未有記載,故需重新將部分參數塞至Array內
$ECPay_EInvoice['CheckMacValue']= $checkMacValue;
$ECPay_EInvoice['ItemName']= $ItemName;
$ECPay_EInvoice['ItemWord']= $ItemWord;
$ECPay_EInvoice['CustomerEmail']= $CustomerEmail;
$ECPay_EInvoice['CustomerName']= $CustomerName;
$ECPay_EInvoice['CustomerAddr']= $CustomerAddr;
// API URL
$EInvoice_URL = 'https://einvoice-stage.ecpay.com.tw/Invoice/Issue';
// 創建一個新的cURL資源
$ch = curl_init($EInvoice_URL);
function httpRequest($api, $data) {
$ch = curl_init($api);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$result = curl_exec($ch);
curl_close($ch);
// 印出 result
print_r($result);
return json_decode($result, true);
}
$data = httpRequest($EInvoice_URL, $ECPay_EInvoice);
?>